#ifndef __SISTEMA_H_INCLUDED__
#define __SISTEMA_H_INCLUDED__

#include "Tablero.h"
#include <string>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "Mensajero.h"
#include "ColaConcurrente.h"
#include "cola/Mensaje.h"
#include "Semaforo.h"

#define TABLERO_PROPIO   0
#define TABLERO_OPONENTE 1

#define COMANDO_MAX_SIZE 255

class Sistema{
private:

	Mensajero *mensajero;

	Tablero jugador[2];	/**< Tableros del jugador */

	ColaConcurrente<Mensaje> *cola;	
	/**< Cola que utilizan los procesos de taclado y mensajero
	 * para comunicarse con el proceso principal. El proceso
	 * principal saca los mensajes de esta cola y los procesa
	 * según su contenido. El tipo de mensaje debe ser
	 * COMANDO_LOCAL o COMANDO_REMOTO. Si es COMANDO_LOCAL, el
	 * sistema asume que es un comando para procesar. Si es
	 * COMANDO_REMOTO asume que es un mensaje para el otro jugador
	 * y lo envía por el Mensajero. */

	bool tengoTurno;

	useconds_t intervaloActualizacion; /**< Intervalo de
					    * actualización del
					    * tablero en microsegundos */

	void dibujarLinea(int ancho){
		for(int i=0;i<ancho;i++)
			std::cout << "-";
	}
			     
	void procesarTeclado();

	/** 
	 * Muestra los comandos disponibles.
	 * 
	 */
	void mostrarAyuda();
	
	void recibirDisparo(int x, int y){
		jugador[TABLERO_PROPIO].recibirDisparo(x,y);
	}

	void determinarTurnos();

	void ubicarBarcos();

	/** 
	 * Muestra los tableros del jugador.
	 * 
	 */
	void dibujarTableros();
public:

	Sistema();

	void loopPrincipal();

	/** 
	 * 
	 * 
	 * @param tiempo Intervalo entre actualizaciones del tablero
	 * en milisegundos.
	 */
	void setTiempoActualizacion(int tiempo){
		if(tiempo > 0)
			intervaloActualizacion = tiempo*1000;
	}

	~Sistema(){
		delete mensajero;
		delete cola;
	}
};

#endif //__SISTEMA_H_INCLUDED__
